1. WebForms controls mess with the markup that is output, this used to be a real nightmare in v1 with tables being inserted everywhere. It's better now but you still don't _know_ what IDs you're going to get and there are still issues like the GridView doesn't output thead rows in the table unless you set certain properties explicitly. All this makes using ASP.NET with third party CSS and JavaScript tools hard because They often rely on markup being defined a particular way
2. ViewState is on by default and posted back to the server every time the page posts back. Most people have slower updoad speeds ti download speeds, so this causes real issues. The whole design of WebForms assumes that every control will be setup once on initial page load and then rebuilt from ViewState each time after that, whereas usually each postback only requires some of the page state to be posted back and a few controls to be rebuilt. Some sort of ViewState group would be useful to tell the page "if the user clicks that button, then these fields are needed at the server end and these other controls will be rebuilt. This would be virtually impossible to retro-fit into WebForms though.
3. UpdatePanels are a performance nightmare and still post back the entire page, usually they are only needed to update 2 or 3 of the controls on the page and a page method would be far more efficient, but UpdatePanels are just so darn convenient (especially given point 1) that they get over used.
Some abstractions are really nice and I totally don't care what happens beneath them, but WebForms is not one of them. Markup matters, IDs matter, upload bandwith matters. WebForms abstracted the stuff I care about and made bad some bad assumptions too.