Heat the butter in a large pot over medium heat. Once melted, add the onion, celery, and carrots. Sauté for 5-6 minutes or until the onions are translucent. Carefully transfer the vegetables to a bowl and set aside.
Return the pot to the heat. Add the oil. Once hot, add the Italian sausage and cook for 4-6 minutes, crumbling until cooked through and no longer pink.
Add the garlic, Italian seasoning, and chili flakes. Sauté for 1-2 minutes or until fragrant.
Stir in the sautéed vegetables, chicken broth, tomato paste, canned tomatoes, salt, and pepper. Increase the heat to medium-high. Once simmering, reduce to medium-low and cook for 10 minutes.
Stir in the orzo, return to a low simmer, and cook for 8-10 minutes or until tender.
Remove from heat. Stir in the baby spinach, half-and-half, and grated parmesan. Stir until the spinach is wilted and the cheese is melted.
Season the soup to taste with salt and pepper. Serve hot, garnished with parmesan cheese and parsley.