Eftersom regex är girigt som standard. d.v.s. uttrycken .* eller .+ försök att ta så många karaktärer som möjligt. Därför <.+> kommer att sträcka sig från den första < till den sista ? :
regexp_replace(teststring, '<.+?>')
eller
regexp_replace(teststring, '<.*?>')
Nu söker du efter > kommer att stanna vid den första
Observera att . innehåller > likaså, därför den giriga varianten (utan ? ) sväljer all > men den sista.