IMHO the ioctl "generic data pipe" interface will always be needed for those use-cases where the more specialised ones don't fit.
Counting total binary size (not source lines or bytes, since those can easily change with formatting differences) is probably the best measure of software complexity, since it's what ultimately runs on the hardware.