PERF: skip libjoin fastpath for MultiIndex
- [x] [Tests added and passed](https://pandas.pydata.org/pandas-docs/dev/development/contributing_codebase.html#writing-tests) if fixing a bug or adding a new feature
- [x] All [code checks passed](https://pandas.pydata.org/pandas-docs/dev/development/contributing_codebase.html#pre-commit).
- [x] Added [type annotations](https://pandas.pydata.org/pandas-docs/dev/development/contributing_codebase.html#type-hints) to new arguments/methods/functions.
- [ ] Added an entry in the latest `doc/source/whatsnew/vX.X.X.rst` file if fixing a bug or adding a new feature.

Addresses #54646 for `MultiIndex` but leaves `RangeIndex` as is. The `RangeIndex` case
seems to have a few side effects - I'll add comments separately to #54646 for `RangeIndex`. 


Also, simplifies the logic in `Index.join` which improves perf for a few `MultiIndex` and non-`MultiIndex` cases.


`multiindex_object` benchmarks:

```
       before           after         ratio
-      18.7±0.2ms       16.6±0.4ms     0.89  multiindex_object.SetOperations.time_operation('monotonic', 'ea_int', 'symmetric_difference', False)
-      19.0±0.7ms       16.5±0.2ms     0.87  multiindex_object.SetOperations.time_operation('monotonic', 'int', 'intersection', False)
-       60.6±10ms         49.8±1ms     0.82  multiindex_object.SetOperations.time_operation('monotonic', 'string', 'intersection', None)
-        40.1±1ms       32.2±0.4ms     0.80  multiindex_object.SetOperations.time_operation('monotonic', 'ea_int', 'intersection', None)
```

`join_merge` benchmarks:

```
       before           after         ratio
-      9.98±0.2ms       8.99±0.1ms     0.90  join_merge.ConcatIndexDtype.time_concat_series('Int64', 'has_na', 1, True)
-      12.2±0.3ms      10.5±0.05ms     0.86  join_merge.ConcatIndexDtype.time_concat_series('int64[pyarrow]', 'has_na', 1, True)
-        13.9±2ms       11.8±0.2ms     0.85  join_merge.ConcatIndexDtype.time_concat_series('datetime64[ns]', 'has_na', 1, False)
-        26.3±3ms      22.3±0.05ms     0.85  join_merge.ConcatIndexDtype.time_concat_series('string[python]', 'monotonic', 1, False)
-        6.50±1ms      5.19±0.05ms     0.80  join_merge.ConcatIndexDtype.time_concat_series('datetime64[ns]', 'monotonic', 1, False)
-         133±2ms         51.1±2ms     0.38  join_merge.Align.time_series_align_int64_index
-       105±0.9ms       23.7±0.5ms     0.22  join_merge.Align.time_series_align_left_monotonic
```


Thanks @lukemanley 