Heat olive oil in a large Dutch oven or soup pot over medium heat. Add onion, carrots, and celery. Sauté for 8-10 minutes until vegetables are softened.
Add garlic and cook for 1 minute, stirring frequently until aromatic.
Pour in the broth and diced tomatoes. Add rosemary, thyme, and bay leaf. Stir well to combine.
Add the cannellini beans and bring soup to a boil. Reduce heat and simmer for 20 minutes to let flavors meld together.
For a creamier texture, use a potato masher or immersion blender to partially mash about half the beans against the side of the pot.
Stir in the kale or spinach and cook for 5 more minutes until wilted. Season with salt and pepper. Remove bay leaf before serving.
Ladle into bowls and top with freshly grated Parmesan cheese and a drizzle of olive oil.