using a magic number for the tween interval duration was driving us nuts.
after a quick dive into the docs we found audiostreamplayer has a stream property and that stream property has a get_length method.
we replaced:
tween.tween_interval(2.5)
with:
tween.tween_interval(explosion_audio.stream.get_length())
now the tween ends at the same time as the audio