WoW back in the day wasn't a terrible drain on stuff though. The details on character models and especially spells wasn't amazing so the amount of data needing to be send wasn't too horrific. Nowadays 40-man raids can easily lead to lag even on decent set-ups simply due to the absolute massive amount of stuff flying around that all needs to be processed at once. It's kinda horrific...
It may not need to though.
I mean: For a lot of stuff there is no need to constantly transfer it over the net. For example for the items. Those are loaded once, and then only when the notification of a change comes. How they look, and to a lesser degree their stats (because the server handles much of it), can often be transmitted in a very short way.
The company I work for transmits pretty complex data (as a programmer I would dare to say they are of similar complexity and size, and transmitted 30+ times a second for several entities) and those are transmitted over very thin lines, some of them have GPRS speed (~200kbps).
That's possible because the clients are fast enough to pack and unpack everything, and make assumptions about where stuff is going. So if the sync works decently, you can get away with transmitting a lot less stuff a lot faster.
Of course I don't know how WoW's netcode evolved over the years, but back then it scaled pretty well, even with "transmogrified" items and the other stuff introduced with the Cataclysm addon.
Spells for example look complex on the GUI but in most cases the only things transmitted about them over the net are their entity of origin (usually the caster), the time when they were cast, and the target entity (or coordinates if it is an area spell). The server checks those, transmits the same information to the clients, and the rest is done by the clients. So while those may be tough on the client hardware, they are often not too severe for the netcode. The transmitted data for a fireball cast to a coordinate could look like this:
32bit playerID (there are not more than 4 billion characters on the server, 16bit ability id (WoW doesn't have more than 65535 abilities, 16 bit ability properties (65535 possible combinations to take variants into account), 3x32bit coordinate for x,y,z (real WoW coordinate systems are probably more simple, that's enough resolution for real world applications) for the point it was aimed at, 32bit timestamp (could also be shorter).
Those are 24 bytes. So let's assume you transmit the 3d position of every entity (let's assume 20 players and as many enemies, all objects have coordinates, a few important attributes such as if they are moving and where they are facing) four times a second (IIRC WoW syncs only twice a second) , and every entity can trigger four abilities per second, then you have a bit more than ~80 kilobits per second that you need, even if you don't compress. And that's a brute force approach, I am sure their devs came up with something more efficient than that.
Guild Wars 2 and Age of Conan also have great netcode btw. For debugging purposes (there were some processes running amok and hogging net resources, which sucked when you had slow Internet and I tried to help the developers by finding out what was the problem) I once limited the network bandwidth for those processes using a net limiter software, and I was amazed that in AoC you could play 20 man raids with less than 100kbps of bandwidth. At least once you were on the dungeon map. It loaded for quite a while in open maps, but on a limited scale (20 players and the map instance with the enemies and so on) it was astonishingly fast.
But then.... code grows, and developers get used to having more resources to their disposal. So they probably use them less efficiently than they did in earlier times.