These are some of the culprits that I've personally seen in my usage:
* Flash. Especially noticeable if I'm using a low-end machine like my netbook on sites that have Flash-based ads (like Anandtech

). I always have Process Explorer open, so it's trivial for me to select the Flash plugin-container process and kill that process tree, which instantly kills all Flash, and sometimes that does wonders.
* Background JavaScript. This is more of a problem with "Web 2.0" sites where pages and content are self-updating. All that background polling can add up and become costly (also, the constant creation and destruction of JS objects churns the heap and garbage collector). Depending on what I have open, disabling JavaScript on my netbook can bring my Firefox CPU usage from 50% down to 5% almost instantly (toggling JS through about:config takes immediate effect, though if you plan on toggling JS often, I'd recommend using NoScript instead). Modern sites use crazy amounts of JS (this becomes more apparent when you use NoScript regularly), and unlike mobile browsers, things keep running in the inactive tabs on desktop browsers, which can add up quickly.
* Increasing heap fragmentation and JavaScript garbage collection. Not that much to be done about this, though (except disabling JavaScript). Usually, after I start Firefox, things work fine for a while, and then it starts to get laggy, and I also notice that memory usage has usually bloated up to something like 6GB or more (I'm using a 64-bit build because I have literally thousands of tabs). But if I have NoScript running, this degradation happens much, much more slowly (might take weeks before it gets annoying). The nature of the lags feel very much like garbage collection to me, and the RAM bloat after running for a long time looks a lot like heap fragmentation (which, in fairness, is a problem faced by any browser and JS engine), and a highly-fragmented heap can cause garbage collectors to slow and lag. Well, that's my theory, anyway--I've never instrumented this to confirm my suspicions. Chrome and IE work around this problem by using multiple processes, which spreads out this "wear and tear" between processes, but in practice, there is so much overhead that it breaks down even worse with my insane-number-of-tabs browsing style.