As you already mentioned, IIS's Request Filtering should be able to help you.
You are using an asp.net MVC site, so any requested URL is checked against all configured routes. This means your application layer is used to respond with a 404 to the request.
Ideally you want a 404 earlier in your request pipeline before your application layer is invoked.
There are several options:
<system.webServer>
<security>
<requestFiltering>
<denyUrlSequences>
<add sequence="/system/login" />
</denyUrlSequences>
<hiddenSegments>
<add segment="system" />
</hiddenSegments>
<filteringRules>
<filteringRule name="systemLogin" scanUrl="true" scanQueryString="false">
<denyStrings>
<add string="system/login" />
</denyStrings>
</filteringRule>
</filteringRules>
</requestFiltering>
</security>
</system.webServer>
You should just play around which one works best for you and doesn't affect your own application.
If you enable Failed Request Tracing, you can see where in the pipeline the 404 response was created. In my test using no request filtering, the 404 was created at position 232 in the pipeling, using request filtering it was created at position 72 so much earlier and before your application layer is invoked.
Yes, an web firewall in front of your IIS server would be even better but lacking that IIS can detect these requests before they get to your application.
Make sure your custom error pages are configured correctly and don't say anything else but 404.