To solve this optimization problem, we need to define the decision variables, objective function, and constraints. 

Let's denote:
- $v$ as the number of vanilla ice cream cones made,
- $c$ as the number of chocolate ice cream cones made.

The profit per cone for vanilla is $2, and for chocolate, it's $3. Therefore, the total profit can be represented by the objective function: $2v + 3c$.

We have several constraints based on the problem description:
1. The ice cream bar must make at least 20 cones of vanilla ice cream: $v \geq 20$.
2. It cannot make more than 50 cones of vanilla ice cream: $v \leq 50$.
3. It must make at least 25 cones of chocolate ice cream: $c \geq 25$.
4. It cannot make more than 60 cones of chocolate ice cream: $c \leq 60$.
5. In total, the ice cream bar can make at most 80 cones: $v + c \leq 80$.

Given these constraints and the objective function, we aim to maximize profit.

Here is how you would set up this problem in Gurobi using Python:

```python
from gurobipy import *

# Create a new model
model = Model("Ice_Cream_Profit")

# Define variables
v = model.addVar(lb=20, ub=50, vtype=GRB.INTEGER, name="vanilla_cones")
c = model.addVar(lb=25, ub=60, vtype=GRB.INTEGER, name="chocolate_cones")

# Set the objective function to maximize profit
model.setObjective(2*v + 3*c, GRB.MAXIMIZE)

# Add the constraint for total cones
model.addConstr(v + c <= 80, "total_cones_constraint")

# Optimize the model
model.optimize()

# Print the results
if model.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Vanilla cones: {v.x}")
    print(f"Chocolate cones: {c.x}")
    print(f"Total profit: ${2*v.x + 3*c.x}")
else:
    print("No optimal solution found")
```