Call / Return breaks isolation, because it makes ad-hoc scheduling decisions.
Call makes a scheduling decision:
- Call implies that the caller will suspend immediately.
- Call implies that the callee is immediately scheduled to run and runs immediately.
- Call implies that the caller executes a WAIT (for the callee).
Return is a scheduling decision.
- The callee dies and immediately resumes the caller.
Operating systems deal with such ad-hoc scheduling decisions using a sledge-hammer called preemption.
Call/Return is baked into the hardware of modern CPUs. This was not always the case. Even stacks were not automatically-managed in earlier CPUs.