If so, does it effectively deprecate the visibility property?
(I realize that Internet Explorer does not yet support this CSS2 property.)
Comparis
There are many differences between visibility and opacity. Most of the answers mention some differences, but here is a complete list.
opacity does not inherit, while visibility does
opacity is animatable while visibility is not.
(Well, technically it is, but there is simply no behaviour defined for, say, "37% collapsed and 63% hidden", so you can consider this as non-animatable.)
Using opacity, you can not make a child element more opaque than its parent. E.G. if you have a p with color:black and opacity:0.5, you can not make any of its children fully black. Valid values for opacity are between 0 and 1, and this example would require 2!
Consequently, according to Martin's comment, you can have a visible child (with visibility:visible) in an invisible parent (with visibility:hidden). This is impossible with opacity; if a parent has opacity:0; its children are always invisible.
Kornel's answer mentions that opacity values less than 1 create their own stacking context; no value for visibility does.
(I wish I could think of a way to demonstrate this, but I can't think of any means to show the stacking context of a visibility:hidden element.)
According to philnash's answer, elements with opacity:0 are still read by screen readers, while visible:hidden elements are not.
According to Chris Noe's answer, visibility has more options (such as collapse) and elements that are not visible no longer respond to clicks and cannot be tabbed to.
(Making this a community wiki, since borrowing from the existing answers wouldn't be fair otherwise.)