404.php loops when Polylang is installed.
When I replaced get_home_url with get_site_url in wp-content/themes/graphene/404.php,
the looping stopped.
I think that the loop occurs because Polylang inserts the language code into the home url.
This url does not really exist and 404 is repeatedly returned.
This is the description of get_home_url:
Retrieves the URL for a given site where the front end is accessible.
This the description of get_site_url:
Retrieves the URL for a given site where WordPress application files (e.g. wp-blog-header.php or the wp-admin/ folder) are accessible.
Maybe you should use get_site_url in 404.php.