get/setcontext do not copy stack, but use an allocated bit of memory space for the stack and swaps stack pointers just like this implementation. I don't see how that's a performance hit.
I do not pretend to know about Windows internals so I won't comment on Windows.