Memory protection.
It's not that preemptive multi-tasking is expensive, or hard. It's not. It's easy. It (can) costs, essentially, the same as cooperative multitasking. You have to save process state in both cases.
But what was holding back the older systems was their early reliance on systems without inherent memory protection, and those legacy's lasted long past the availability of hardware that actually had supported Memory Management Units (MMU).
Take the Mac. It's legacy was the 68000, which had not direct MMU support.
It was not long before the Mac came out with 68020 based machines (which DID have such support). But the OS has to run not just on the new hardware, but the old hardware, and the two systems are quite incompatible. Plus the actual impact on software design on those systems.
When you start from scratch, like OS/2, then, yea, "it's easy".
MacOS heritage held it back for a long, long time before they were able to replace with with MacOS X via it's Carbon compatibility layer for the software in the new, Unix-ish environment.
The OS for the Apple IIGS was actually a "better" MacOS in someways, notably in process management and memory management. MacOS 2.0.
Windows suffered similarly. Recall early Windows ran on the 8088. Not the 80286, the 8088. That legacy also burdened it for quite sometime.
Code has momentum, choices have consequences. Be amazed they worked at all.