With the last SDCC version (I don't know with the previous) the z80 target has support for banks. You can create a megarom without doing weird things. Calling methods from one page to another is totaly transparent (with a little performance cost).
You can see my test project at https://github.com/samsaga2/sdcc_megarom. It is far from finished, now it only supports changing the second page. But it works and we can have a complete solution with a little of work.
Summary
- Generate banking code directly from the SDCC
- Call to a function in the same module has not any performance penalty, only calling from one bank to another.
- I am using the SDCC way, is not an external utility that could stop working with new SDCC versions.
- My code is unfinished but a complete solution can be done.