I know this problem exists and seen the layout being affected due to users switching between HTML and Visual editor. I tried to reproduce this today and unable to do it though – the span tag stays even after multiple edits and updates.
There isn’t really a solution to this other than to write a WP shortcode for these headings. I have also had some luck with placing line breaks before and after the tag to help overcome this issue. Try it out and let me know if the problem still exists after you format the source a little bit with extra line-breaks and I will have a couple of shortcodes written to tackle this issue with headings. Thanks