Sauté the aromatics: In a large pot over medium heat, warm the olive oil and butter.
Add the onion with a pinch of salt. Cook, stirring occasionally, until soft and translucent, about 6–8 minutes. Stir in the garlic and cook 30 seconds, just until fragrant.
Build the base: Add tomato paste and cook, stirring, for 1–2 minutes to caramelize slightly.
This deepens the flavor and tames bitterness.
Add tomatoes and broth: Pour in the canned tomatoes (with juices) and the broth. If using whole peeled tomatoes, break them up with a spoon. Stir in sugar, oregano, basil, and red pepper flakes if using.
Simmer: Bring to a gentle boil, then reduce to a simmer.
Cook uncovered for 20–25 minutes, stirring now and then. The flavors will meld and the soup will thicken slightly.
Blend: Turn off the heat. Use an immersion blender to puree until smooth.
For extra silky texture, blend in batches in a countertop blender, venting the lid. Return to the pot.
Add cream and season: Stir in the heavy cream. Taste and adjust with salt and black pepper.
If the soup is too thick, splash in a bit more broth; if too thin, simmer a few minutes more.
Make the grilled cheese: While the soup simmers, spread butter on one side of each bread slice. Sprinkle a tiny pinch of garlic powder over the butter if you like. Heat a skillet over medium.
Place two slices, buttered side down, top with cheese, then close with the remaining slices, buttered side up.
Cook to golden: Grill 2–3 minutes per side, pressing gently, until the bread is crisp and the cheese melts. Reduce heat if browning too fast. Transfer to a cutting board and let rest 1 minute.
Cut into croutons: Slice each sandwich into 1-inch cubes with a sharp knife or serrated knife.
Try not to squish them; a gentle sawing motion works best.
Serve: Ladle soup into bowls. Top generously with grilled cheese croutons. Finish with a drizzle of good olive oil, a few basil ribbons, or Parmesan if desired.