To solve this optimization problem, we first need to convert the natural language description into a symbolic representation. Let's define the variables and the objective function.

We have two types of chocolate: milk chocolate and dark chocolate. Let's denote:
- \(x_1\) as the number of milk chocolate pieces.
- \(x_2\) as the number of dark chocolate pieces.

The objective is to minimize the total cost, which can be represented by the objective function:
\[0.50x_1 + 0.75x_2\]

The constraints are based on the requirements for cacao and sugar units in the mixture:
- Each milk chocolate piece contains 3 units of cacao, so \(x_1\) contributes \(3x_1\) units of cacao.
- Each dark chocolate piece contains 4 units of cacao, so \(x_2\) contributes \(4x_2\) units of cacao.
- The mixture must contain at least 120 units of cacao: \(3x_1 + 4x_2 \geq 120\).

For sugar:
- Each milk chocolate piece contains 2 units of sugar, so \(x_1\) contributes \(2x_1\) units of sugar.
- Each dark chocolate piece contains 1 unit of sugar, so \(x_2\) contributes \(x_2\) units of sugar.
- The mixture must contain at least 80 units of sugar: \(2x_1 + x_2 \geq 80\).

Additionally, the number of milk and dark chocolate pieces cannot be negative:
- \(x_1 \geq 0\)
- \(x_2 \geq 0\)

So, the symbolic representation is:
```json
{
    'sym_variables': [('x1', 'number of milk chocolate pieces'), ('x2', 'number of dark chocolate pieces')],
    'objective_function': '0.50*x1 + 0.75*x2',
    'constraints': ['3*x1 + 4*x2 >= 120', '2*x1 + x2 >= 80', 'x1 >= 0', 'x2 >= 0']
}
```

Now, let's implement this in Gurobi using Python:

```python
from gurobipy import *

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

# Add variables
x1 = model.addVar(vtype=GRB.CONTINUOUS, name="milk_chocolate_pieces", lb=0)
x2 = model.addVar(vtype=GRB.CONTINUOUS, name="dark_chocolate_pieces", lb=0)

# Set the objective function
model.setObjective(0.50*x1 + 0.75*x2, GRB.MINIMIZE)

# Add constraints
model.addConstr(3*x1 + 4*x2 >= 120, "cacao_constraint")
model.addConstr(2*x1 + x2 >= 80, "sugar_constraint")

# Optimize the model
model.optimize()

# Print the results
if model.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Number of milk chocolate pieces: {x1.x}")
    print(f"Number of dark chocolate pieces: {x2.x}")
    print(f"Total cost: {model.objVal}")
else:
    print("No optimal solution found")
```