The logic you mention of hooking up on the quit signal still works for me.
You can easily test it by putting this content in a file:
import QtQuick 2.0
Item { Component.onCompleted: Qt.quit() }
And then loading it with example/qmlscene:
./qmlscene quit.qml
This should work fine. If I comment out the engine.On("quit", ...) logic in qmlscene.go, I get the same error you describe:
$ ./qmlscene quit.qml
2015/02/26 01:26:19 qqmlengine.cpp:1756: Signal QQmlEngine::quit() emitted, but no receivers connected to handle it.
and the process won't exit.
Can you please try it out with the sample, and investigate how it differs from the failing environment?