Warm the olive oil in a large pot over medium-high heat. Add the carrots, onion, and celery, then cook for a few minutes until they begin to soften.
Stir in the diced tomatoes with their juices, tomato paste, chicken broth, oregano, and dried basil. Bring everything to a light boil and let it simmer until the vegetables are tender.
Blend the soup until smooth using an immersion blender. A standard blender works too, though you may need to puree it in batches. Pour the soup back into the pot afterward. This step is optional if you prefer a chunkier texture.
In a separate saucepan, melt the butter over medium-low heat. Add the flour and whisk continuously for about 10 minutes, until the mixture turns golden and develops a rich, nutty aroma.
Scoop a ladle of the hot soup into the roux and stir until it forms a thick, smooth mixture. Add a few more ladles of soup, mixing well each time.
Pour the roux mixture into the soup pot and stir until fully blended.
Add the Parmesan, half-and-half, salt, pepper, and fresh basil. Stir until the cheese melts and the soup is creamy and heated through.
Taste and adjust the seasoning with extra oregano, basil, salt, or pepper as needed.