Equal? recursively compares the contents of pairs, vectors, and strings, applying eqv? on other objects such as numbers and symbols. A rule of thumb is that objects are generally equal? if they print the same. Equal? may fail to terminate if its arguments are circular data structures.
There is a silver lining though. In R6RS the following was added:
Note: The equal? procedure must always terminate, even if its arguments contain cycles.
That is, there is a good chance that the behaviour of equal? changes, when the PLT Scheme team begins implementing the R6RS language.