diff --git a/core/lib/Drupal/Core/Render/Placeholder/CachedStrategy.php b/core/lib/Drupal/Core/Render/Placeholder/CachedStrategy.php
index 941c11ac27ebe02bec8b6392f42c264e685d3001..757f647e5f0a178810835149f72f962683759364 100644
--- a/core/lib/Drupal/Core/Render/Placeholder/CachedStrategy.php
+++ b/core/lib/Drupal/Core/Render/Placeholder/CachedStrategy.php
@@ -21,7 +21,41 @@ public function __construct(
    * {@inheritdoc}
    */
   public function processPlaceholders(array $placeholders) {
-    return $this->renderCache->getMultiple($placeholders);
+    $return = $this->renderCache->getMultiple($placeholders);
+    if ($return) {
+      $return = $this->processNestedPlaceholders($return);
+    }
+
+    return $return;
+  }
+
+  /**
+   * Fetch any nested placeholders from cache.
+   *
+   * Placeholders returned from cache may have placeholders in #attached, which
+   * can themselves be fetched from the cache. By recursively processing the
+   * placeholders here, we're able to use multiple cache get to fetch the cache
+   * items at each level of recursion.
+   */
+  private function processNestedPlaceholders(array $placeholders): array {
+    $sets = [];
+    foreach ($placeholders as $key => $placeholder) {
+      if (!empty($placeholder['#attached']['placeholders'])) {
+        $sets[] = $placeholder['#attached']['placeholders'];
+      }
+    }
+    if ($sets) {
+      $cached = $this->renderCache->getMultiple(...array_merge($sets));
+      if ($cached) {
+        $cached = $this->processNestedPlaceholders($cached);
+        foreach ($placeholders as $key => $placeholder) {
+          if (!empty($placeholder['#attached']['placeholders'])) {
+            $placeholders[$key]['#attached']['placeholders'] = array_replace($placeholder['#attached']['placeholders'], $cached);
+          }
+        }
+      }
+    }
+    return $placeholders;
   }
 
 }
diff --git a/core/modules/navigation/tests/src/FunctionalJavascript/PerformanceTest.php b/core/modules/navigation/tests/src/FunctionalJavascript/PerformanceTest.php
index 3264d769c195b30c90ac75c17cfc939ff97ce040..f1ca3242a2a8263e63317751e0c7f38eaee21d40 100644
--- a/core/modules/navigation/tests/src/FunctionalJavascript/PerformanceTest.php
+++ b/core/modules/navigation/tests/src/FunctionalJavascript/PerformanceTest.php
@@ -73,14 +73,14 @@ public function testLogin(): void {
 
     $expected = [
       'QueryCount' => 4,
-      'CacheGetCount' => 49,
+      'CacheGetCount' => 48,
       'CacheGetCountByBin' => [
         'config' => 11,
         'data' => 4,
         'discovery' => 10,
         'bootstrap' => 6,
         'dynamic_page_cache' => 1,
-        'render' => 16,
+        'render' => 15,
         'menu' => 1,
       ],
       'CacheSetCount' => 2,