If you expect to have high cache hits and/or have ssd or similar fast storage, random page cost should be more like 1-2 rather than the default 4. When using jsonb, you'd normally have estimates based solely on the constants for the associated datatype (1/3 or 2/3 for a nullable boolean for instance, and I think half a percent for an int column) but because you are using an index on a function, you should be getting custom stats related to that. They just don't seem to be helping you a ton.
With gin indexes, there is also the pending list to consider. I haven't had to deal with that much, but just know of it from the documentation.