Look up different game AI architectures: scripted, rule-based, finite state machines, behavior/decision tree, utility, planning, hierarchical task networks, and machine learning. Hard-coded imperatives are very difficult on highly autonomous architectures, as is complex systemic behavior in authored ones. Consider how hard it is to make an autonomous AI system like ChatGPT implement one simple hard imperative: not revealing the system prompt.
Weak AI and strong AI are ambiguous terms. Most junior-level software engineers can create very complex gameplay systems if you're talking about complexity. It’s much harder to build simple ones that effectively create the illusion of intelligence on limited hardware. If you are talking about difficulty, then challenging AI is no harder to make than easy AI. Usually, game designers will naturally create hard AI as they play the game so much they become experts, and player testing is used to make it easy again.
As you describe it, the move evaluator is a utility function approach that is neither very authorable/personable nor very autonomous. It is pretty limiting on both fronts, so it’s rarely used. A simple rule-based approach is more straightforward to balance and personalize for each agent/archetype. And difficulty scaling or balancing the game differently doesn’t require what you propose. They just chose not to do the balancing you want.
There’s nothing wrong if you prefer a utility approach. We all have our preferences, and I like some pretty clever AI systems like GOAP that aren’t always a good fit for games like Civ. They are cool and smart systems but players rarely respond better to them than simple FSMs or rule-based game AI, which are easier to author. The utility approach is somewhere in the middle and could also be made context-specific with enough separate utility functions the agent would evaluate. But it is so much more work than to define simple if-then rules. :)