Unity has overridden the == operator to return things as null, even when they’re not, and vice versa.
When you call Destroy(gameObject), the gameObject is not instantly removed from memory - it’s kept around in a “destroyed” state. Unity’s == override takes this into account, so if you compare a “destroyed” state gameObject to null with ==, it works as you’d expect. But, the null coalescing operator (??) doesn’t have a clue what’s going on, so it sees the object and returns it as non-null.