Réponse acceptée !
Pour éviter d'avoir une concaténation et éventuellement une variable, il aurait mieux vallu utiliser les séquences d'échappement :
$content = str_replace('<?', "<?php echo '<?' \x3f>", $content);
$content = str_replace("\x3f>", "<?php echo '\x3f>' \x3f>", $content);
Mais effectivement le problème ne vient pas de là, je viens de tester et je confirme que PHP ne tient pas compte des balises fermantes incluses dans des chaînes.
Sinon l'objectif me parait clair, il s'agit d'un moyen d'échapper les balises du PHP pour que ce dernier n'aille pas les interpréter, sûrement à l'usage de balises telles que <?xml ... ?>. Après il faut connaitre l'utilisation de cette méthode pour savoir si c'est maladroit ou non. Si c'était pour afficher du PHP au lieu de l'exécuter, il aurait mieux vallu un htmlentities.
Sans précisions supplémentaires, on ne peut pas savoir, parce que son code marche très bien.