Brown the beef: Heat a large, deep skillet or Dutch oven over medium-high. Add the ground beef and season with a pinch of salt and pepper.
Cook, breaking it into small crumbles, until well-browned with crispy edges, about 5–7 minutes. If there’s more than 1 tablespoon of fat, drain off the excess, leaving a little for flavor.
Soften the aromatics: If the pan looks dry, add the olive oil. Add the onion and cook, stirring, until softened and lightly golden, 3–4 minutes.
Stir in the garlic and cook 30 seconds until fragrant.
Build the tomato base: Add the tomato paste and cook, stirring, for 1 minute to caramelize it slightly. Sprinkle in oregano, thyme, smoked paprika, and red pepper flakes if using. Stir to coat the beef and onions.
Add tomatoes and broth: Pour in the crushed tomatoes and 2 1/4 cups of broth.
Stir well and bring to a gentle simmer.
Cook the orzo: Stir in the dry orzo. Reduce heat to medium-low, cover partially (leave a small gap), and cook for 10–12 minutes, stirring every couple of minutes so the orzo doesn’t stick. If the mixture gets too thick before the orzo is tender, splash in more broth, 2–3 tablespoons at a time.
Make it creamy: When the orzo is just al dente and the sauce is thick and saucy, stir in the heavy cream and Parmesan.
Simmer another 1–2 minutes until glossy and creamy. Taste and adjust salt and pepper.
Finish with greens: Fold in the spinach and let it wilt, 30–60 seconds. The sauce should be creamy, not soupy.
If it tightens too much, loosen with a little broth or a splash of cream.
Serve: Spoon into bowls and top with extra Parmesan and chopped basil or parsley. Serve hot.