Teensy microcontrollers from 8-bit AVRs (ATmega32u4, AT90USB1286) to 32-bit Cortex (Kinetis MK20DX128, MK20DX256, MK64FX512, MK66FX1M, and i.MX RT1062) all have native USB interfaces (and NOT an USB-serial bridge chip), and the standard Teensyduino add-on to Arduino provides several such configurations out-of-the-box, including Serial + Keyboard + Mouse + Joystick: three HID endpoints and an USB CDC (ACM) endpoint. The sources for the LGPL-licensed cores are at
GitHub.
For 8-bit AVRs like ATmega32u4,
LUFA is an open source USB stack, that implements these also.
Typically, the microcontrollers have a limited number of endpoints it can support. Even ATmega32u4, which has a full speed USB 1.1 interface (12 Mbit/s), can support four. (And an CDC ACM endpoint on it can do about 1 Mbyte/sec, close to theoretical maximum including the USB protocol overhead; this with just the basic Arduino (Leonardo) USB stack on a cheap eBay $4 Pro Micro clone.)
One "packet" will be reserved for each HID endpoint for each millisecond, but the rest is available for the CDC endpoint. (I haven't used isochronous endpoints, but simply put, they too get reserved a certain bandwidth; these are used for audio and video and similar time-dependent streams.)
Teensy 4 (i.MX RT1062) has a full speed USB 2.0 (480 Mbit/s), and I haven't yet found its theoretical maximum. When using USB serial (CDC ACM), the Linux tty layer becomes a bottleneck; even a simple MCU-to-host
example can achieve >200 Mbit/s (25.7 Mbytes/sec).
Ping-ponging 512-byte messages half-duplex yields over 20 Mbits/s (2.5 Mbytes/sec, or about 5000 such message roundtrips per second). So, the hardware can definitely do this stuff at ease; it's just the vendor libraries on the MCU and the host OS drivers that can throw a spanner in the works.
(I'm actually playing a bit with the Linux kernel, experimenting if a non-TTY raw character device on one hand, and a socket family on the other hand, that both provide a socket-like interface for USB CDC ACM and USB bulk transfers, would make sense. I really don't like having to rely on something as fragile and ever-changing as libusb. We should have learned from ALSA and old graphics drivers how crappy that kind of kernel-library dependency really is.)