Most performance conversations start with a score. I care more about how the site feels when someone is standing in a shop with two bars of signal. These are the things I check, roughly in order.
Start with a baseline
Measure the current site on mobile before changing anything. Lighthouse is fine for a quick signal; WebPageTest gives you more detail. If you can, open the site on a real mid-range phone. Emulation is useful, but it lies less when you use it consistently.
Images
Most slow sites are carrying too many large images. Check the actual dimensions, not just the file size. A 3000px hero displayed at 1200px is wasted bytes. Compress, resize, use WebP or AVIF where it helps, and lazy-load images below the fold.
Don't lazy-load the image at the top of the page. That's the one people are waiting for.
Fonts
Every font family and weight is a request. If the design can live with two weights, use two. Self-host where possible, subset if the budget allows, and use font-display: swap so text doesn't disappear while the font loads.
CSS and JavaScript
Audit the plugins and scripts that load on every page. A slider plugin for one image, a form plugin for a form that could be plain HTML, or three analytics scripts will cost more than they return. Defer what isn't needed for the first paint.
With WordPress, the plugin list is usually the biggest lever. Every plugin is code you didn't write and now have to maintain.
Caching and hosting
Page caching, a CDN if the audience is spread out, and a host that doesn't have slow disk I/O. Check the time to first byte before you spend hours optimizing images. If the server takes two seconds to respond, the rest of the checklist is working against a bad start.
Re-measure
Compare against the baseline. Keep the numbers somewhere. Performance work tends to drift back after a few plugin updates or a new campaign page, so a simple before-and-after record is useful.
The goal isn't a perfect score. It's a site that doesn't make people wait. Measure, fix the biggest problem, and check again.