Lo que sucede es que no puedes especificarle a str_replace() que esquive los <pre>, pues la función trabaja con la cadena de texto completa.
Lo que si puedes hacer es extraer lo que está dentro de los <pre> con expresiones regulares y así puedes colocar una marca, haces tus reemplazos y después recuperas el texto original dentro de los <pre> basandote en la marca.
No es algo sencillo si no sabes de lo que hablo, te sugiero investigar al respecto.