Most "slow WordPress site" audits turn up the same handful of culprits, in roughly this order of impact.
1. Unoptimized images
This is the single biggest offender, by a wide margin. A hero image exported straight from a design tool at full resolution can easily be 3–5MB. Serve it as a properly sized, modern-format (WebP/AVIF) image instead, and that one fix alone often cuts load time in half.
2. Plugin bloat
Every plugin adds its own CSS, JavaScript, and often database queries — whether or not the current page needs them. A site with 40 active plugins, each loading assets globally, is fighting itself before a single visitor arrives. The fix isn't "delete everything," it's auditing which plugins actually need to run on which pages.
3. No caching layer
Without page caching, WordPress rebuilds every page from scratch — querying the database, running PHP, assembling HTML — on every single request. A caching layer (page cache plus object cache) turns that into serving a static file for most visits.
4. Render-blocking scripts and fonts
Scripts and stylesheets loaded in the <head> without defer/async block the browser from painting anything until they've downloaded. Same story with web fonts loaded without font-display: swap — visitors stare at invisible text.
5. Shared or under-provisioned hosting
Sometimes the honest answer is that no amount of optimization fixes a $5/month shared hosting plan serving a busy ecommerce catalog. Good hosting is infrastructure, not a nice-to-have.
Where to start
If you only have time for one thing: run the site through PageSpeed Insights, sort the recommendations by estimated savings, and fix images first. It's almost always the highest-leverage change available.