La compresión es un único ajuste con un efecto grande e inmediato sobre el texto: HTML, CSS, JavaScript, JSON, SVG. No tiene efecto alguno sobre lo que ya está comprimido, y pedirla ahí cuesta procesador para nada.

Actívala

gzip on;
gzip_vary on;
gzip_comp_level 5;
gzip_min_length 1024;
gzip_types text/plain text/css application/json application/javascript
           text/xml application/xml image/svg+xml;

El nivel 5 es el término medio útil. El nivel 9 cuesta bastante más procesador por un uno o dos por ciento, en cada petición.

Qué NO comprimir

JPEG, PNG, WebP, MP4 y ZIP ya están comprimidos. Pasarles gzip por encima deja el archivo levemente MÁS GRANDE y quema procesador al hacerlo. La excepción es image/svg+xml: el SVG es texto.

Brotli, donde esté disponible

brotli on;
brotli_comp_level 5;
brotli_types text/plain text/css application/json application/javascript image/svg+xml;

Brotli suele quedar entre un 15 y un 20 % por debajo de gzip en texto. Mantén gzip configurado al lado: el navegador dice qué acepta y el servidor elige.

Comprueba que está ocurriendo

curl -sI -H 'Accept-Encoding: gzip, br' https://yourdomain.com/ | grep -i content-encoding

Que no haya cabecera content-encoding significa que no se comprime nada, a menudo porque un proxy por delante está quitando la cabecera de la petición.

gzip_min_length importa: comprimir una respuesta de 200 bytes cuesta más de lo que ahorra, porque el sobrecoste de cabecera es de tamaño fijo. Un kilobyte es un suelo razonable.