The cost of crossing the userspace/kernel boundary happens on any system call and has nothing to do with context switching.
(Modern OS's typically context switch during system calls for i/o, exactly the same as userspace threads.)
The biggest cost of a context switch, though, is typically that your CPU goes to do something else, which reduces the efficiency of any caches (including branch prediction etc.). This is the same whether you have kernel or userspace context switches, assuming the threads you're switching between touch different code and/or data.
Both OS and "green" threads are meant to switch when doing i/o.
Even with traditional kernel side IO, you might not want to attempt a syscall if the socket is known not to be ready.
Also when implementing purely userspace synchronization primitives, being able to swap to a different context purely in userspace is nice.