In case this helps the next unlucky code monkey: GStreamer playbin2‘s gapless support, which depends upon the ‘about-to-finish‘ signal, only works if you set the new URI on the playbin within that callback. Even though the callback is emitted from a different thread to the one you created / initialised the playbin on!
Also, blocking the callback for any appreciable time causes audio glitches. Hence, I conclude you need to have your next URL ready to go when about-to-finish fires, or hilarity will ensue.