Porque regex es codicioso por defecto. Es decir. las expresiones .* o .+ trate de tomar tantos caracteres como sea posible. Por lo tanto <.+> abarcará desde el primer < hasta el último > . Hazlo perezoso usando el operador perezoso ? :
regexp_replace(teststring, '<.+?>')
o
regexp_replace(teststring, '<.*?>')
Ahora, la búsqueda de > se detendrá en el primer > encontrado.
Tenga en cuenta que . incluye > también, por lo tanto, la variante codiciosa (sin ? ) se traga todo el > pero el último.