PERF: reindex with 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 an entry in the latest `doc/source/whatsnew/v1.5.0.rst` file if fixing a bug or adding a new feature.

Avoid unnecessary (and potentially expensive) call to MultiIndex._values. This only matters when MultiIndex._values has not been cached. Existing asv has been updated to test cached and non-cached cases.

```
import numpy as np
import pandas as pd

mi = pd.MultiIndex.from_arrays(
  [np.arange(10**6)] * 2
)
mi2 = pd.MultiIndex.from_arrays(
  [np.arange(10**7)] * 2
)

df = pd.DataFrame({"A": 1.0}, index=mi)

%timeit x = df.reindex(mi2.copy())
```

```
1.84 s ± 106 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)   <- main
685 ms ± 22.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)  <- PR
```
very nice @lukemanley  I think this PR made pyright unhappy, but I honestly don't see how this PR affected _mixins.py:

> pandas/core/arrays/_mixins.py:185:26 - warning: Instance methods should take a "self" parameter (reportSelfClsParameterName)

If the solution is to ignore this warning, you can add
`# pyright: reportSelfClsParameterName = false`
at the top of the file.

edit:
or rename cls to self:
https://github.com/pandas-dev/pandas/blob/3e718e3f20df55d7f915985d427e28e4c00d79a2/pandas/core/arrays/_mixins.py#L185 i think was a prior PR > i think was a prior PR

Yes, you are right: #46214 If no one beats me, I will create a PR to rename cls to self