Your assertion is accurate. There is no functional difference, except that modifiers by design have a smaller range of potential uses.
Functionally, they behave the same way with the constraint that modifiers can only use arguments sent to the function and can only alter contract storage. Inline function calls however, can also be passed memory variables inside the function and can more directly impact the functions code logic.
A modifier can also only execute its logic all at once either before or after the functions body is executed -- where as an inline function call can happen at any point during the functions execution.
Modifiers exist for readability and organization. If a lot of functions have the same requirements to be executed (an isOwner modifier for example), or re use the same patterns, have the same preparation or cleanup process, etc -- it provides a clean way to implement these without cluttering the function body so it can contain only what is unique to that function.
This also makes it easy to determine which patterns a function is implementing just looking at its declaration/signature:
function updateBalance(uint newBal) onlyOwner onlyIfUnpaused {
Just looking at the function declaration clearly informs you of the traits inherited by the modifier patterns: that only the owner can call it and only if the contract is currently unpaused.