For an example of plot option customization that I am still rather proud of please see:
How to change the default ColorData used in Mathematica's Plot?
For general customization I think you already outlined some good options. I personally favor the custom function method for maximum control. Another, perhaps cleaner method that I crudely copy from Leonid works well if you can pool options for all plot types in one list ($myoptions):
Update: changed withOptions to use the "injector pattern" so as not to disrupt functions if withOptions is used indiscriminately (withOptions[ 1 + 1 ]).
$myoptions = {Filling -> {1 -> {{2}, {Red, Purple}}}}; SetAttributes[withOptions, HoldFirst] withOptions[head_Symbol[body__]] := FilterRules[$myoptions, Options[head]] /. {opts___} :> head[body, opts] withOptions @ Plot[{Sin@Log@x, Cos[3 x]}, {x, 0, Pi}] 