Start with Drupal’s built in caching. Enable the internal page cache, dynamic page cache, and BigPipe modules. These alone give significant improvements for most sites.
Next, set up a reverse proxy like Varnish or a CDN for static and cacheable content. Use Redis or Memcached for object caching instead of the default database cache. Optimise images by using responsive image styles and modern formats like WebP and AVIF.
Audit your modules. Disable anything you are not using, as every active module adds overhead. Review custom code for N plus 1 query problems and expensive operations. Use a profiler like Blackfire or Xdebug to identify bottlenecks. Performance tuning is an ongoing process rather than a one off task. Small improvements compound over time into dramatically faster sites.