Prep the vegetables. Dice the onion, carrots, and celery. Mince the garlic.
Rinse and chop the greens if using. Drain and rinse the beans.
Build the base. Warm 2 tablespoons olive oil in a large pot over medium heat. Add onion, carrots, and celery with a pinch of salt.
Cook 6–8 minutes, stirring, until soft and slightly golden.
Add garlic and spices. Stir in garlic and a pinch of red pepper flakes. Cook 30–60 seconds, just until fragrant. If using, stir in 1 tablespoon tomato paste and cook 1 minute to caramelize.
Layer in beans and broth. Add beans, 6 cups broth, bay leaf, and herbs.
If you have a Parmesan rind, drop it in. Bring to a gentle simmer.
Simmer for flavor. Reduce heat to low and simmer 15–20 minutes. This melds the flavors and softens the beans.
Thicken for creaminess. Use a ladle to transfer 2 cups of soup (mostly beans and broth) to a blender and puree until smooth, or use an immersion blender directly in the pot for a few quick pulses.
Return the puree to the pot. The soup should look creamy but still have texture.
Add the greens. Stir in chopped kale, spinach, or chard. Simmer 3–5 minutes until tender.
Remove bay leaf, herb stems, and Parmesan rind.
Finish and season. Stir in 1–2 teaspoons lemon zest and 1–2 tablespoons lemon juice. Season with salt and plenty of black pepper. Taste and adjust—more acid, more salt, or a drizzle of olive oil can round it out.
Serve warm. Ladle into bowls, top with grated Parmesan, a drizzle of olive oil, or fresh herbs.
Add crusty bread on the side if you like.