diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb
index 7755b346b81ee6572aa44d972b14f3bed28a466b..0f84768e2a79bcb5c4cf0fe111d60c5e80c915a6 100644
--- a/app/controllers/projects/merge_requests_controller.rb
+++ b/app/controllers/projects/merge_requests_controller.rb
@@ -149,15 +149,27 @@ def pipelines
 
     Gitlab::PollingInterval.set_header(response, interval: 10_000)
 
+    serializer_options = {
+      disable_coverage: true,
+      disable_failed_builds: true,
+      preload: true
+    }
+
+    if Feature.enabled?(:skip_status_preload_in_pipeline_lists, @project, type: :gitlab_com_derisk)
+      serializer_options.merge!(
+        disable_manual_and_scheduled_actions: true,
+        preload_statuses: false,
+        preload_downstream_statuses: false
+      )
+    end
+
     render json: {
       pipelines: PipelineSerializer
         .new(project: @project, current_user: @current_user)
         .with_pagination(request, response)
         .represent(
           @pipelines,
-          preload: true,
-          disable_failed_builds: true,
-          disable_coverage: true
+          **serializer_options
         ),
       count: {
         all: @pipelines.count
diff --git a/app/controllers/projects/pipelines_controller.rb b/app/controllers/projects/pipelines_controller.rb
index 516aa70cf89626fdf425bf01d708ef7f57255e54..a87c4b722d87093488bd9c83ccc702d8853e35e0 100644
--- a/app/controllers/projects/pipelines_controller.rb
+++ b/app/controllers/projects/pipelines_controller.rb
@@ -226,14 +226,26 @@ def downloadable_artifacts
   private
 
   def serialize_pipelines
+    serializer_options = {
+      disable_coverage: true,
+      disable_manual_and_scheduled_actions: true,
+      preload: true
+    }
+
+    if Feature.enabled?(:skip_status_preload_in_pipeline_lists, @project, type: :gitlab_com_derisk)
+      serializer_options.merge!(
+        disable_failed_builds: true,
+        preload_statuses: false,
+        preload_downstream_statuses: false
+      )
+    end
+
     PipelineSerializer
       .new(project: @project, current_user: @current_user)
       .with_pagination(request, response)
       .represent(
         @pipelines,
-        disable_coverage: true,
-        preload: true,
-        disable_manual_and_scheduled_actions: true
+        **serializer_options
       )
   end
 
diff --git a/app/serializers/pipeline_serializer.rb b/app/serializers/pipeline_serializer.rb
index a3e842d348e520bf1c9f2a43c59d8484d28fd1ae..0a14988b08d522645e215267cc736fbfe3eb14c3 100644
--- a/app/serializers/pipeline_serializer.rb
+++ b/app/serializers/pipeline_serializer.rb
@@ -6,17 +6,9 @@ class PipelineSerializer < BaseSerializer
 
   # rubocop: disable CodeReuse/ActiveRecord
   def represent(resource, opts = {})
-    if resource.is_a?(ActiveRecord::Relation)
-      resource = resource.preload(preloaded_relations)
-    end
-
-    if paginated?
-      resource = paginator.paginate(resource)
-    end
-
-    if opts.delete(:preload)
-      resource = Gitlab::Ci::Pipeline::Preloader.preload!(resource)
-    end
+    resource = resource.preload(preloaded_relations(**opts)) if resource.is_a?(ActiveRecord::Relation)
+    resource = paginator.paginate(resource) if paginated?
+    resource = Gitlab::Ci::Pipeline::Preloader.preload!(resource) if opts.delete(:preload)
 
     super(resource, opts)
   end
@@ -38,15 +30,15 @@ def represent_stages(resource)
 
   private
 
-  def preloaded_relations
+  def preloaded_relations(preload_statuses: true, preload_downstream_statuses: true, **)
     [
       :pipeline_metadata,
       :cancelable_statuses,
       :retryable_builds,
       :stages,
-      :latest_statuses,
       :trigger_requests,
       :user,
+      (:latest_statuses if preload_statuses),
       {
         manual_actions: :metadata,
         scheduled_actions: :metadata,
@@ -59,15 +51,15 @@ def preloaded_relations
         project: [:route, { namespace: :route }],
         triggered_by_pipeline: [{ project: [:route, { namespace: :route }] }, :user],
         triggered_pipelines: [
+          (:latest_statuses if preload_downstream_statuses),
           {
             project: [:route, { namespace: :route }]
           },
           :source_job,
-          :latest_statuses,
           :user
-        ]
+        ].compact
       }
-    ]
+    ].compact
   end
 end
 
diff --git a/config/feature_flags/gitlab_com_derisk/skip_status_preload_in_pipeline_lists.yml b/config/feature_flags/gitlab_com_derisk/skip_status_preload_in_pipeline_lists.yml
new file mode 100644
index 0000000000000000000000000000000000000000..3758e2fce9b4db6cc63027c0aaeec9a82c230bb5
--- /dev/null
+++ b/config/feature_flags/gitlab_com_derisk/skip_status_preload_in_pipeline_lists.yml
@@ -0,0 +1,9 @@
+---
+name: skip_status_preload_in_pipeline_lists
+feature_issue_url:
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/142947
+rollout_issue_url: https://gitlab.com/gitlab-com/gl-infra/production/-/issues/17482
+milestone: '16.9'
+group: group::pipeline execution
+type: gitlab_com_derisk
+default_enabled: false
diff --git a/ee/app/serializers/ee/pipeline_serializer.rb b/ee/app/serializers/ee/pipeline_serializer.rb
index 82527eef4ce8f9c2707434af3f81f2de71ab3560..1de6b621cd6efd3b1ae631b9a99fca9a5ba2baad 100644
--- a/ee/app/serializers/ee/pipeline_serializer.rb
+++ b/ee/app/serializers/ee/pipeline_serializer.rb
@@ -6,7 +6,7 @@ module PipelineSerializer
 
     private
 
-    def preloaded_relations
+    def preloaded_relations(...)
       relations = super
 
       project_relation = relations.detect { |item| item.is_a?(Hash) }