Understanding Fisheye
The problem is that you're trying to map a hemisphere (the view) onto a plane (the rendered image). There is always going to be distortion.

But you're right, you might be able to choose what distortion you get. Have a look at the various projections used in geospatial software. If you want equal angles, perhaps one of the equal area projections would suit you - although I suspect Blender's fisheye lens is already some kind of equal area projection.

As for implementing a different projection, you might be able to do it with an OSL shader, by placing a lens object in front of the camera.