IIRC libfuzzer doesn't necessarily depend on clang. It is coverage-guided so if gcc could generate the instrumentation to emit the coverage data, it would probably just work.
Way back when AFL was around but libfuzzer didn't exist yet, I think AFL came with a modified gcc that did that instrumentation. Maybe now that's upstreamed?
gcc has had code coverage/gcov since before llvm/clang existed. My guess is that the format is different enough from clang's that libfuzzer may need some love to do dual formats (unless it already can - I have not checked).
Because libfuzzer is way better than gcc-based fuzzers. Also much easier to use. I usually get 20x more libfuzzer hits than with afl++ and friends. And there I usually have to use the llvm-based variant to keep compile times under 1hr. It compiles 20x faster.