So let's separate your questions.
If a WMS specifies
image/GeoTIFF then the expectation would be that if you request such an image through a GetMap request like below, then the image returned should have projection information embedded:
But I see that, as you say, it doesn't:
hodor@Mini ~/REST/downloads $ gdalinfo -proj4 wms.tiff
Size is 1000, 1000
Coordinate System is `'
PROJ.4 string is:
Image Structure Metadata:
Upper Left ( 0.0, 0.0)
Lower Left ( 0.0, 1000.0)
Upper Right ( 1000.0, 0.0)
Lower Right ( 1000.0, 1000.0)
Center ( 500.0, 500.0)
Band 1 Block=1000x2 Type=Byte, ColorInterp=Red
Band 2 Block=1000x2 Type=Byte, ColorInterp=Green
Band 3 Block=1000x2 Type=Byte, ColorInterp=Blue
So I would regard that as an error of the server software.
In the GetMap request I specify a srs, so I assume (maybe wrongly?) that the response I get contains a crs.
The assumption is wrong.
Generally, images (png, jpeg, gif, tiff...) requested by a client through a GetMap request are not georeferenced. The client requests an image for a location specified by a bounding box (in the coordinates of the projection the client is working with) and the server sends back the image; it doesn't need to be georeferenced because the client knows where to put it. So if you want a georeferenced image you will need to do the extra work based on the request parameters.
Is there a way to do this?
Not in owslib, because you can't make a request do do this through a WMS, other than a standard GetMap request where the image format is GeoTIFF, and the server sends a GeoTIFF.
or do I have to use GDAL to project the result, and if so, how?
You should probably ask another more focussed question