Go's goroutine runtime, Ruby's Fiber, and pre-1.5 Java's green threads all started from exactly this design: cooperative user-space stacks switched with saved register state instead of kernel involvement. The single-kernel-thread limitation you'll hit here is precisely why early Java green threads were dropped in favor of native threads once multi-core CPUs became common in the early 2000s.