The need for MMU for multi-tasking OSes has grown when OSes evolved from single task to multi-task. Originally computers were single task with code hard linked to a certain start address.
Relocation has been around forever. It's a must if you have code that is loadable at runtime.
Even if you have a machine that in most use loads a image to a fixed address and jumps there it's very unlikely that no one has never found a use for position independent code on it.
Next step was introduction of MMUs so programs could still think they were single task but actually were multi-tasking.
You don't need an MMU to do multitasking. MMUs are for memory protection and virtualising address spaces.
If you don't need this legacy there is no reason to not relocate the binaries during load.
If you want to have code that is loadable at runtime without switching out the complete task every time the active task changes you have to have relocation or some sort of address space virtualisation. It's far more sensible to have a table of addresses that have to be relocated by whatever loads the code than it is to move entire tasks around in memory.
Some people think you need multiple adress spaces in order to provide memory protection.
Who thinks that? Lots of microcontrollers provide limited memory protection without an MMU. I.e. write to address range X in user state causes an exception.