Thre reason why traceroute uses UDP instead of ICMP is
very simple -- there are a lot of broken-as-designed
unices which either do not provide non-superuser access
to harmless ICMP facilities, or cannot trace replies back
to originating process.
I'd rather fix operating systems than leaving a nice big
vulnerability in the network.