Slow Drupal sites usually have a handful of repeat causes. Profile first, then fix in order of impact.
1. Heavy or uncached Views
Views that join many tables, sort on unindexed fields or load full entities are the most common culprits. Check the generated SQL, add indexes where needed, limit fields, and make sure the View’s cache setting is not disabled.
2. Missing cache metadata in custom code
Drupal’s render cache depends on cache tags, contexts and max-age. Custom blocks and controllers that omit them either cannot be cached at all or are cached wrongly. Declare them properly and most of the page can be served from cache.
3. Cache backends and reverse proxies
Move the cache bins to Redis or Memcache instead of the database, and put Varnish or a CDN in front for anonymous traffic. Make sure purge on content change is wired up through cache tags.
4. Too much front-end weight
Use responsive image styles, lazy loading and aggregated, minimal CSS and JavaScript. Core Web Vitals problems are often image and script problems, not Drupal problems.
5. Server basics
Check PHP version and OPcache, database settings and slow query logs.
Measure before and after each change so you know what actually helped.