Eu resolvi o problema como Fabian sugeriu (obrigado novamente). No entanto, não fiquei satisfeito com toda a construção do fluxo de dados. Afinal, é o Zenity que deve monitorar o progresso do trabalho; Eu não deveria ter que dobrar todo o meu programa apenas para torná-lo feliz.
Então, mudei todo o fluxo de trabalho. Primeiro eu crio um pipe nomeado para comunicar o progresso ao Zenity e, em seguida, Zenity funciona como deveria (como monitor). Então eu chamo:
(tail -f my_named_pipe) | zenity .... &
e quando eu quero definir um rótulo ou progresso eu simplesmente chamo
echo "# We are cruising..." > my_named_pipe
Se eu terminar o progresso, envio "100" para o Zenity. Isso permite que meu script principal funcione de maneira linear, sem se preocupar em passar dados de um subprocesso, porque não há subprocesso agora.