ORDER BY clause kills query performance
Your ORDER BY clause is on:

engagement(social) DESC NULLS LAST, "users"."created_at" ASC


But I suspect your index is just on:

engagement(social) DESC NULLS LAST


So the index is not capable of fully supporting the ORDER BY.

You can reproduce the same issue without using either JSONB or expression indexes.  You might be able to salvage the situation by creating a composite expression index over both columns in your ORDER BY.

If the PostgreSQL planner were infinitely wise, it might be able to use the existing index efficiently.  It would have to march up engagement(social) DESC NULLS LAST until it collected 12 tuples which met all the rest of the filter requirements.  Then it would have continue marching up that index until it collected all the rest of the tuples which were tied on engagement(social) with the 12th tuple (and which met the other criteria).  Then it would have to re-sort all of the collected tuples on the full ORDER BY, and apply the LIMIT 12 to that expanded and re-sorted set.  But the PostgreSQL planner is not infinitely wise.