Legends are special. In particular, their default rendering can’t be described in CSS, so browsers use non-CSS means of rendering them. What that means is that a statically positioned legend will be treated like a legend and be separate from the actual content of the fieldset.
The weird doesn’t end there; if you reverse the order of the span and the legend, the legend will still show up on top in most browsers (but not in Opera, apparently).