I believe the differences are due to how Linux and Windows, macOS are designed.
Linux kernel is monolithic. Windows and macOS are based on a micro-kernel design. So Windows and macOS will have a disadvantage when dealing with I/Os, as drivers are user space processes. Linux drivers runs in kernel spaces, so it has less overhead when processing.
I can't really speak to Windows, but XNU (the macOS kernel) is monolithic, not micro.
A monolithic kernel puts everything into a single address space, with communication between subsystems consisting of function calls. On the other hand, a microkernel is a tiny thing that's basically just a memory allocator, process scheduler, and messaging API, with all other kernel subsystems - device drivers, filesystems, network stack, etc - broken out into separate independent processes which communicate with each other (and userspace) by sending messages through the microkernel.
Lots of people get tripped up by the fact that XNU is partly based on Mach, and Mach is a microkernel, so that must mean XNU is a microkernel too right? But really XNU just uses Mach code as one of the building blocks in a monolithic design. There's no rule which says "when you borrow Mach's memory, process, and message passing code, you must push everything else out into separate processes".
All that said, a fairly recent development in XNU is increasing support for userspace drivers. This isn't being done for the sake of making XNU into a microkernel, it's to improve system security. Drivers are a common weak point in attacks against the kernel, so if you can isolate them into their own processes, a driver 0-day may not be able to compromise the whole system anymore.