In my experience this is a very standard thing to do. You’ll need to make sure your firmware is linked at the right addresses, and have your bootloader do the copying. I’ve got an example in the zero-to-main repo: https://github.com/memfault/zero-to-main/tree/master/bootload-reloc.
As far as I know, no microcontroller allows dynamic memory mapping. Some allow XIP from a quad-spi peripheral, in which case there is fixed address space mapped to it in hardware.