Preheat oven to 425°F. Cut Roma tomatoes or cherry tomatoes in half lengthwise, or if using larger beefsteak tomatoes, remove cores and cut into quarters or sixths, depending on their size. Place the tomatoes in a shallow roasting pan or on a rimmed baking sheet lined with foil. Drizzle with olive oil, season with salt and pepper, and toss to coat.
Roast the tomatoes until tender and just barely beginning to caramelize, about 30 minutes.
Once the tomatoes are cool enough to handle, peel off the skins as much as possible (it’s fine if some is left on). Set aside, reserving the juices from the tomatoes as well.
In a large Dutch oven or soup pot, melt the butter over medium heat. Add the onion and sauté until soft, about 5-7 minutes. Add the garlic and cook, stirring constantly, for 30 seconds. Add the flour and stir for 1 more minute.
Gradually add the broth and wine, stirring constantly to make sure that everything comes together smoothly. Add the roasted tomatoes with juices, and sugar. Bring the soup to a boil, reduce the heat to low, and simmer (uncovered) for about 30 minutes. Stir in the milk (or cream) and the basil; cook until warmed through, about 5 minutes.
Use an immersion blender or transfer a portion of the soup to a large blender to puree some of the soup until it's smooth. I like to leave some chunks of tomatoes and onion for texture, but you can make it as smooth or as chunky as you like.
Taste the soup and season with additional salt, pepper, or sugar, if needed. Ladle into bowls, garnish with additional basil, and serve!