In most ircd I've looked at, the 0 has to be manually replaced so it matches all users (by pretending no mask was specified at all), whereas the '*' makes use of the wildcard matching abilities in the ircd.*
It really is up to preference which you use (if they're both supported), but I personally find '/who * o' to be more understandable ("show all clients (*) with oper (o) usermode"), also it's probably pretty common having users confuse the '0' with 'O'.
I'm not sure of any ircd having different methods, unrealircd does have a different format, but I'm not sure if this is used to find opers or whether it can still use the old method.
Hope this helps
* = many ircd actually look for "*" and remap this to a 'blank query' also to reduce load (no need to do match() checks), but for the sake of your question this isn't relevant.