QUIC needs a kernel implementation. At least in Linux, TCP/IP does a lot of its processing in soft interrupt handlers which is far cheaper and more responsive to pre-empt compared to UDP packet delivery and wakeup to an application thread.
You don't want your transport acknowledgement packets to get delayed/lost because of app thread scheduling.