When ASSERT fails or when CRASH is called the current proc is stopped but the parent proc continues. If you have something like this:
proc/square_root(x)
if(x < 0)
CRASH("x must be positive.")
return sqrt(x)
mob/verb/Test()
var/a = square_root(-3)
world << a + 1
CRASH prints the error message and stack trace but the Test verb keeps running and prints "1". The square_root proc crashing affects the rest of the verb so I'd want the whole thing to stop. If I only wanted the square_root proc to stop I'd use a return statement instead of the CRASH proc.
The only benefit CRASH gives you is printing the stack trace. This seems to limit its usefulness.