I'd say -O2 -march=native -mtune=native is good enough, you get (some) AVX without the O3 weirdness.
To be able to support multiple arch levels in the same binary I think you still need to do manual work of annotating specific functions where several versions should be generated and dispatched at runtime.