I think the way to go is that you do such big backwards incompatible refactors gradually. Eg you want to make all the callers specify some additional parameter. So first you create a version of your API which populates this parameter with some reasonable default. Then old API is marked deprecated and is just calling new API with that default value, and then you inline everywhere the old api. After a while it’s possible to remove the old API.

That said you need of course some tooling to somehow discover all the callers reliably and do those migrations on a large scale.

Easier to do if all the code is owned by one org but harder if you can’t reliably tell who’s using your APIs.

However having centralized migrations is really saving a lot of work for the org.