If the goal is a single, well-defined data shape as the final answer — extracting fields from a document, classifying into fixed categories — structured output constraints are simpler and don't need the function-calling machinery around them.
If the model needs to choose between multiple possible actions, potentially call several in sequence, or the task is genuinely agentic (decide what to do, then do it), function calling is built for that — structured output alone doesn't model "pick an action."
A function call's arguments are themselves structured output — the distinction is really about whether the model is choosing an action (function calling) or just shaping a final answer (structured output), and a real system often uses both at different points.