Why does my file_exist check fail?

get_template_directory_uri doesn’t return the directory name, it returns the URL of the directory. file_exists needs a file path, not a file URL.

Use get_template_directory instead, and don’t forget to check get_stylesheet_directory too for those using child themes