I just ran into a similar problem. I wound up using your solution to execute raw SQL to set the default.
f = RGeo::Geos.factory(srid: 4326)
empty_polygon = f.polygon(f.line_string([]))
add_column :solutions, :visible_geom, :geometry, srid: 4326, default: empty_polygon
but reverted back when my db/schema.rb contained a line like this:
t.geometry "visible_geom", limit: {:srid=>4326, :type=>"geometry"}, default: #<RGeo::Geos::CAPIPolygonImpl:0x3a2d3a4 "POLYGON EMPTY">
Thee memory address would change every time I ran the migration. Either way is not a great solution as I do not think I could safely create a new database from schema.rb without running the migrations.