Sauté Aromatics: Heat 2 tablespoons olive oil in a Dutch oven or large soup pot over medium heat. Add diced onion and cook for 4 to 5 minutes until soft and translucent. Stir in minced garlic, rosemary, thyme, and red pepper flakes, cooking for 60 seconds until fragrant.
Simmer Beans & Broth: Add drained cannellini beans and vegetable broth. Bring to a gentle boil, then reduce heat to medium-low and simmer uncovered for 10 minutes to marry the flavors.
Partially Blend for Creaminess: Remove pot from heat. Using an immersion blender, pulse 4 to 5 times directly in the pot (or transfer 2 cups of soup to a standard blender, purée, and return to pot) until the soup is thick and velvety while still retaining plenty of whole beans for texture.
Wilt the Spinach: Return pot to low heat. Stir in fresh baby spinach leaves and simmer for 2 minutes until just wilted and bright vibrant green.
Season & Finish: Stir in grated Parmesan cheese and fresh lemon juice. Season with salt and black pepper to taste.
Garnish & Serve Warm: Ladle into wide shallow bowls. Drizzle with extra virgin olive oil, top with shaved parmesan, cracked black pepper, and serve with warm crusty artisan bread.