As pointed out by @Damien_The_Unbeliever the ST_INTERSECTION function is just a thin wrapper over the geometry based function and does not perform any spherical calculations. If you want to get (an approximation) of the correct result you can first segmentize the geography (which does perform spherical calcs) as below
select
st_astext(
st_intersection(
ST_Segmentize(ST_GeographyFromText('LINESTRING(-40 40, 40 40)'), 1000),
ST_Segmentize(ST_GeographyFromText('LINESTRING(0 30, 0 50)'), 1000)
))
This returns POINT(0 47.60591395513534) as expected.