i did some experiments with usb serial, even for that matter Serial.write(buffer, length); it is about 1-2 Mbps, this compares to what is seen for usb mass storage i'd think.
the main thing about usb is that it is *polled*, so the host decides how to multiplex the devices and how much time slice to give to each device, and that each device is probably given a 1ms time slice each to 'speak'. getting about 1-2 Mbps reflects that there are about between several to a dozen devices on the bus. you could count your keyboard, mouse, hubs (including internal hubs) as devices. it isn't very efficient as many of that 1ms that is 'unused' would be 'wasted', say the keyboard / mouse send a couple of interrupts in its 1ms time slice. it is pretty much 'time sharing'.
i think it is possible to monitor statistics even from stm32 end by keeping counts, e.g. say in its own 1ms timeslice how much data is sent.
if it is about 1 KB for that 1ms timeslice, the usb bandwidth allocated is probably already fully utilized. 12 Mbps / 1000 ms ~ 1.2KB per 1ms slice. and you have not added the framing overheads
on some skus supporting usb high speed, it is possible to go usb high speed (480 mbps?), but that requires a separate high speed transceiver, and some additional circuits. one of the trouble is that ulpi high speeds if often run at say 60 mhz delivering a (8 * 60) 480 mbps signalling speed. a trouble is i think with ordinary 'dupont' cables, that 60 mhz signals may be badly compromised, unless one take precautions with capacitance etc.
there are some of such boards floating around if one is keen to experiment.
https://www.aliexpress.com/wholesale?ca ... xt=usb3300
usb high speeds is quite attractive as some stm32 adc has sample speeds that could make use of it, streaming out in real time