I have never really thought much about calculating the speed, but clearly there is real overhead associated with this kind of transfer. I searched on Google and found post after post with speeds as you described, making me thing you are on to something.
I just whipped out a USB 2.0 1TB Seagate external drive, formated it, and decided to copy a sampling large enough to test with: 13,595,211,905 bytes (about 12GBs). I am running Symantec Endpoint Protection AV.
According to this calculator, it should have taken only 3:46 minutes to copy with 0% overhead, but it actually took 9:17, and my speed dropped to 23.9 MB/sec actually.
I then rebooted (to clear the memory), and tried it without my AV running and it still took 9:15, or only 2 seconds less (I guess that is good news for Symantec AV at least).
It would appear that those really are "theoretical numbers".