Well-written code in an expressive language can be very close to a config file, but also has the nice ability to scale up in complexity when required.
It's not either or. A config file checked into git and applied by a CI/CD pipeline is infrastructure as code.
Config files work fine. But so does expressive code with the right abstractions. And I think code scales up better and down almost as well. Just my opinion.
if you're talking yaml... you could argue that config file is also code, just a different language