is_set will do a hash calculation bucket lookup, and then possibly a chain walk via a linked list if your keys hash too close together. It's a pretty constant access time, no matter how large your list gets.
If I'm coding in Perl, it is a choice to use it. It takes a bit longer to construct and load a hash list though, so I don't use it by the default if I don't need it, and instead want standard array access (queuing, push, pop, numeric access, etc).
I understand that it is not an option in PHP, hashes are simply used. It simply depends on what method of access you use.
I ASSUME in_array has to access the first item, compare it, access the next item, compare it, read the next item, compare it.
But the time you've gotten to the 3rd compare (or so, no I haven't timed this), a hashed lookup would be complete.
So how many orders of magnitude is it if is is a 20,000 item lookup table, which would mean (assuming that 3 record walk vs hash access time holds) it is 6,666 times faster.