I always believed that fork() was the very essence of the beauty of UNIX. So simple, yet so powerful. And it is far simpler than its predecessor on Genie, which looked a lot more like spawn().
With fork, the child inherits properties which may not have existed when the code was written, so it's much easier to reason about the behavior of sub-processes. Fork made writing the shell and pipelines much more obvious.
Today we know that threads and shared mutable memory are a really bad idea, it's just that the hardware gave us no alternatives. I claim UNIX is directly responsible for the existence of MMUs in microprocessors. What if CPU designers would add facilities to directly implement inter-process or inter-processor messaging? Sadly, there has to be a dominant software paradigm for the hardware guys to target, so there's a nasty chicken and egg problem. Imagine if the Erlang model of distributed systems had taken off. Go gets us part of the way there, but cross-machine messaging is still a mess.