I thought the usual reason for avoiding -O3 was that it significantly increases code size for only a slight improvement in speed? (Inlining to a silly extent, for example.)
Yes, the purpose of -O3 is exactly that it's the "extreme" speed optimization which can blow up compilation speed (many don't consider this relevant anymore; it was actually a significant argument for the different optimization levels 20-30 years ago), and the binary size, and sometimes it does poor choices which may
reduce the speed (e.g., pipelining and caching of the target machine not understood perfectly by optimizer; e.g. inlining too much can kill performance if fetching the program produces more cache misses!) - so it's a setting one normally uses "under supervision", so, you measure the results - did you get the speed benefit you wanted, and was the program size increase acceptable.
-O2 and -Os are the most obvious defaults on most targets and projects. -O1 instead of -O2 if compilation speed is important, but it rarely is nowadays.
The "trying to avoid compiler bugs by not using -O3" is real but a more subtle thing - compiler bugs exist at any optimization level because to err is human, that's all to it; highest optimization levels only increase the
probability somewhat because the compiler is doing more advanced things, so more surface area for bugs, but that's a rather weak correlation in the end.
The "avoiding -O3 because my own code is buggy and I don't want to admit it is and -O0 seems to fix it" is the sad story which we unfortunately see on forums. This way of thinking should be left behind, with one caveat: there is a real gray area of commonly used and useful practices which are technically against the standard, but
make sense and
existing software uses them - in such cases, compiler designer should consider real-world use above the standard-correctness and not break programs whose intent is sensible, clear and justified de-facto usage of language. But these are rare exceptions, too, it is unfortunately too easy to use this as an argument to rationalize one's own procrastination / unwillingness to fix one's own code when that would be the best solution to everyone - just fix the bug and make the code standard compliant.