Потребовалось заменять " на « и ».
Проблема именно в том, что четный и нечетные заменяются на разный символ, поэтому простым использованием функции str_replace проблемы не решить.
В итоге нужно написать регулярное выражение для замены обычных / двойных кавычек на "как в ворде" (авычки ёлочкой):
echo preg_replace( '/"([^"]*)"/', "«$1»", 'Текст "в кавычках" и еще текст.' );