diff --git a/moto/ec2/models/route_tables.py b/moto/ec2/models/route_tables.py
--- a/moto/ec2/models/route_tables.py
+++ b/moto/ec2/models/route_tables.py
@@ -76,6 +76,12 @@ def get_filter_value(self, filter_name):
             return self.associations.keys()
         elif filter_name == "association.subnet-id":
             return self.associations.values()
+        elif filter_name == "route.gateway-id":
+            return [
+                route.gateway.id
+                for route in self.routes.values()
+                if route.gateway is not None
+            ]
         else:
             return super().get_filter_value(filter_name, "DescribeRouteTables")
 

Marking as an enhancement! Thanks for raising this @jawillis 
diff --git a/tests/test_ec2/test_route_tables.py b/tests/test_ec2/test_route_tables.py
--- a/tests/test_ec2/test_route_tables.py
+++ b/tests/test_ec2/test_route_tables.py
@@ -94,6 +94,8 @@ def test_route_tables_filters_standard():
 
     vpc2 = ec2.create_vpc(CidrBlock="10.0.0.0/16")
     route_table2 = ec2.create_route_table(VpcId=vpc2.id)
+    igw = ec2.create_internet_gateway()
+    route_table2.create_route(DestinationCidrBlock="10.0.0.4/24", GatewayId=igw.id)
 
     all_route_tables = client.describe_route_tables()["RouteTables"]
     all_ids = [rt["RouteTableId"] for rt in all_route_tables]
@@ -135,6 +137,16 @@ def test_route_tables_filters_standard():
     vpc2_main_route_table_ids.should_not.contain(route_table1.id)
     vpc2_main_route_table_ids.should_not.contain(route_table2.id)
 
+    # Filter by route gateway id
+    resp = client.describe_route_tables(
+        Filters=[
+            {"Name": "route.gateway-id", "Values": [igw.id]},
+        ]
+    )["RouteTables"]
+    assert any(
+        [route["GatewayId"] == igw.id for table in resp for route in table["Routes"]]
+    )
+
     # Unsupported filter
     if not settings.TEST_SERVER_MODE:
         # ServerMode will just throw a generic 500

The filter 'route.gateway-id' for DescribeRouteTables has not been implemented in Moto yet.
Would you consider adding support for route.gateway-id filter in the DescribeRouteTables command?

tests/test_ec2/test_route_tables.py::test_route_tables_filters_standard
tests/test_ec2/test_route_tables.py::test_route_table_associations tests/test_ec2/test_route_tables.py::test_route_tables_defaults tests/test_ec2/test_route_tables.py::test_routes_vpn_gateway tests/test_ec2/test_route_tables.py::test_create_route_with_network_interface_id tests/test_ec2/test_route_tables.py::test_route_tables_additional tests/test_ec2/test_route_tables.py::test_network_acl_tagging tests/test_ec2/test_route_tables.py::test_create_route_with_egress_only_igw tests/test_ec2/test_route_tables.py::test_create_vpc_end_point tests/test_ec2/test_route_tables.py::test_create_route_with_unknown_egress_only_igw tests/test_ec2/test_route_tables.py::test_routes_replace tests/test_ec2/test_route_tables.py::test_create_route_with_invalid_destination_cidr_block_parameter tests/test_ec2/test_route_tables.py::test_describe_route_tables_with_nat_gateway tests/test_ec2/test_route_tables.py::test_create_route_tables_with_tags tests/test_ec2/test_route_tables.py::test_route_tables_filters_associations tests/test_ec2/test_route_tables.py::test_routes_vpc_peering_connection tests/test_ec2/test_route_tables.py::test_associate_route_table_by_gateway tests/test_ec2/test_route_tables.py::test_routes_not_supported tests/test_ec2/test_route_tables.py::test_route_table_replace_route_table_association tests/test_ec2/test_route_tables.py::test_routes_additional tests/test_ec2/test_route_tables.py::test_route_table_get_by_tag tests/test_ec2/test_route_tables.py::test_associate_route_table_by_subnet