Searching for "chicken soup" among thousands of documents can take two very different paths.
Only a handful of documents actually mention chicken soup. The question is how Postgres finds them.
This is a sequential scan: Postgres computes a tsvector for every row, checks it against the query, and discards most of the work.
A GIN index already maps every word to the rows that contain it. Postgres jumps straight to rows 3 and 7, no computing, no checking, no wasted work.