I ended up making a tool for this. It's located on GitHub at ckinateder/google-photos-exif-merger. My tool does handle the strange filename changes mentioned in previous answers, as well as situations with missing JSON files (for live photos, the takeout only creates one JSON file for multiple media files). My tool also detects where file types are mismatched and automatically attempts to rename.
There's a CLI version and an optional GUI interface (in web browser). It's written in Python with minimal packages, so it's not too hard to setup.