In a small bowl, use a fork or potato masher to crush half of the cannellini beans into a creamy paste and set them aside. This step helps thicken the soup naturally while preserving some whole beans for texture.
Warm the olive oil in a large soup pot over medium-high heat. Add the diced onion, carrots, celery, and zucchini, followed by the minced garlic, thyme, and sage. Season with salt and pepper. Cook for about 5 minutes, stirring occasionally, until the vegetables begin to soften and release their aroma.
Pour in the chicken or vegetable broth, along with the diced tomatoes and their juices. Stir well, scraping the bottom of the pot to release any flavorful bits. Bring the mixture to a gentle boil.
Add both the mashed beans and the remaining whole beans, stirring to combine. Reduce the heat to medium and simmer for a few minutes to let the flavors meld. Stir in the chopped spinach and cook until wilted and tender, about 3 minutes more.
Ladle the Tuscan vegetable soup into bowls and, if desired, sprinkle freshly grated Parmesan cheese on top before serving. Enjoy it warm with a slice of crusty bread for a wholesome, comforting meal.