> For example, MMUs are unnecessary if the OS verifies that all programs only access memory that's been allocated to it.
You'd need some sort of proof-carrying code to allow verification of these properties in binaries. Also, features like MMU's and interrupts are needed anyway to implement virtual memory, or user tasks with adjustable priorities.