The four that are usually it
Imagery that was never budgeted. A hero exported straight from the design tool at full resolution can be several megabytes on its own. Re-export as webp, and size it to the largest slot it actually occupies on screen rather than the largest screen you happen to own.
Fonts loading with `font-display: block`. The text waits, invisible, for the font file to arrive. Switching to `swap` costs you a brief flash of the fallback and buys you the entire first paint, which is the metric being measured and the moment the visitor decides you are working.
Third-party scripts. The chat widget, the heatmap, the A/B tool, the two analytics pixels and the one from a campaign that ended fourteen months ago. Audit the list; it is almost always longer than anyone expects and shorter than it needs to be.
Animation that touches layout. Movement built on transform and opacity is close to free. Movement that changes width, height or position forces the browser to re-measure the page on every frame, and on a mid-range phone that is where the smoothness goes.

Budget the artwork, not just the layout
The PawSpot homepage is almost entirely photograph, five puppies at full height across the lower half, with a ring of breeder and buyer avatars orbiting the headline above them. That imagery is the argument the page is making, so it could not simply be reduced.
The answer is to decide the page's weight budget alongside the design rather than after it. When the picture is the product, its size is a design constraint, not a build detail to be discovered at the end.
What speed will not fix
A fast page that does not answer the visitor's question still loses. Speed is a multiplier on a page that works, never a substitute for one, a two-second load on an unclear offer just gets you to the disappointment sooner.
There is also a real ceiling. If the page has to load and filter genuinely large amounts of data, no amount of image compression addresses that, because the constraint is the architecture rather than the assets. That is a different decision, and it has its own post on this blog.