REF: Simplify Index.union
This is the `Index.union` part of #41153. This helps simplify that PR.

The special casing in `Index.union` is currently active if both are numeric. After #41153 it should only be special cased if one dtype is uint64 and other a signed int. So after this and #41153:
* int8 & uint32 -> int64
* [u]int64 & float64 -> float64
* int64 & uint64 -> object
* int8 & uint64 -> object

The first and second case is handled correctly by `find_common_type`, but the others aren't currently.

This PR changes no functionality itself, but prepares for the changes in #41153, where we want e.g. `NumericIndex[int8] .union(NumericIndex[uint32])` to give `NumericIndex[int64]` and not `Index[object]`.
I’ve updated to find_common_type_compat. looks fine can you rebase @topper-123 ping when ready here (then @jbrockmendel can rebase other) I’ve rebased. thanks @topper-123 