PostgreSQL covering index on large table as alternative to CLUSTER command
PostgreSQL does not have covering indexes.  There has been some work on them, but it has not yet been accepted into the code tree.

So there are limitations.  If you have unique constraint on some prefix of the indexed columns, you will have to have a separate index to support that, it can't piggy-back on your larger index.  Also, some data types do not support Btree operators which means they cannot be included into a btree index. For example, XML or many geometric types.

Also, an indexed value cannot exceed 1/3 of a page, or about 2700 bytes, so inclusion of some wide columns into the index could fail on this grounds (I don't think covering indexes, if they existed, would solve this problem)

Finally, you only avoid consulting the table for those table pages marked as "all visible".  If the table is mostly static, then is probably not a problem.  But it the table is very dynamic, it will take very aggressive vacuuming to maintain the "all visible" count.

Partitioning the table may be another option.  It is not nearly as fine-grained as clustering it, but can impose less of an ongoing burden.  Particularly if all the active updates go against 1 or 2 partitions, while the rest are effectively read-only.