Short answer is, you can achieve the same with different idioms but some are better in some cases than another. Pick the one that reduces amount of code that you and user need to write because it will probably contribute to experience and robustness.
Options which expect functions
ColorFunction, MeshFunctions etc all are supposed to be functions because the author provides a fixed set of arguments and it is up to the user what to do with them.
Options with :>
Why not a function for EvaluationMonitor? Because, among others, NMinimize can have many different things in its varspec. It can be a symbol, list of symbols, _ ∈ region_, etc.
Either user would have to have parse it MonitorFunction -> myMonitor @* standardizeVarspec or the author would have to waste time to convert any varsepc to e.g. a list of symbols. Not worth the effort if user can just write Print[x].
Options with :> vs symbolic options
The gain in Path :> $Path case, except it obviously delays $Path evaluation, is that the author does not need to write OptionValue[Path] /. Automatic -> $Path etc. Not the major problem but that line can be half of its length. Additionally it is self documenting.
It may be worth it, if the default value ($Path) is simple and there is only one default value (for more you need to switch inside anyway).
If it is not simple it may be a pain to use when user writes a code that plays with that option. This is fine:
... path = If[condition, customPath, $Path]; YourFunction[..., Path -> path] ...
This is not:
... opt = If[condition, customOpt, complexValueOf[YourFunction's, Default->Option] (*made up example*) ]; YourFunction[..., Opt -> opt] ...
So here a symbolic options make more sense:
... opt = If[condition, customOpt, Automatic ]; YourFunction[..., Opt -> opt] ...