Я бы посоветовал использовать exec(), так как есть возвращение результата, в отличии от shell_exec(). У себя на голом сервере проверил, работает команда нормально.
Оказалось, что дело в кодировке. Начиная с 7.1 в моем случае не нужно дополнительно указывать кодировку.
те. вызов программы balcon.exe с разными ключами, среди которых было указание кодировки текста.
На 7.0 и ниже нужно вот так - shell_exec("balcon.exe -t 'Тест' -enc utf8 -w file.wav");
А на 7.1^ нужно без указания кодировки - shell_exec("balcon.exe -t 'Тест' -w file.wav");