Several reasons. You can cuddle a ~ up to identifiers, and it doesn't disappear visually when you do so. Unary ~ came available when we unified all the XORly operators under ^ (including old unary ~, that is, 1's-complement, which implicitly XORs all the bits with 1). Plus underscore basically comes across as a very short identifier, and we wanted to reserve it for possible use as some kind of "don't care" token in logic programming, as it's used in Prolog. Or maybe we'll think of some other use for it. (I can guarantee you that it won't be the current stat buffer as it is in Perl 5, though, since you can put a stat result into any variable now.)
But, of course, the main reason is that ~ looks like a piece of string. :-)