Heat the oil in a large, heavy pot or Dutch oven over medium-low heat. Add the onion, carrot, and garlic, season with salt and pepper, and sauté until the onion is tender and golden brown, about 8 minutes.
Turn the heat to medium-high, add the escarole, and cook, stirring occasionally, for 4 minutes, until the escarole is wilted. Add the broth, beans (if using), and tomatoes, and bring to a simmer over high heat. Reduce heat to medium-low. Simmer until the escarole is tender, about 20 minutes.
Add the spinach and stir until the spinach is wilted, about 2 minutes. Adjust the seasonings.
Ladle the soup into bowls, sprinkle with the Parmesan cheese, if desired, and serve hot.
Notes
This soup can be made up to 3 days ahead of time and reheated over medium heat on the stove.
You can freeze this soup for up to 4 months, though the greens might soften even further when defrosted and reheated.
Adding the baby spinach at the end allows it to wilt but still retain some of its delicate texture.
You can also use roughly chopped, more mature spinach leaves. Give them an extra couple of minutes to cook down.
If you plan to make this soup ahead of time, add the spinach to the pot when you've reheated it. This will prevent the spinach from becoming too soft.