Userspace IO is a thing though.
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.
Both OS and "green" threads are meant to switch when doing i/o.