Even then, it's probably easier to let a separate process do the heavy work
I suspect there's something very interesting to do by mixing a preemptive-separate-memory scheduler with a collaborative-shared-memory one, e.g. luaproc+luasched. It's well established that you shouldn't mix shared memory and preemption, but having both options integrated seamlessly enough would let you pick your poison on a case-by-case basis, within a single application.
Here you'd put your heavy computations in a separate luaproc process, and just wait for the result.