To solve this problem, we first need to convert the natural language description into a symbolic representation. Let's denote the number of acres of lavender as $x_1$ and the number of acres of tulips as $x_2$. 

The objective function is to maximize profit, which can be represented algebraically as $250x_1 + 200x_2$, since the profit per acre of lavender is $250 and the profit per acre of tulips is $200.

The constraints are:
- The gardener has 50 acres available: $x_1 + x_2 \leq 50$
- The gardener must grow at least 5 acres of lavender: $x_1 \geq 5$
- The gardener must grow at least 8 acres of tulips: $x_2 \geq 8$
- The gardener can grow at most twice the amount of lavender as tulips: $x_1 \leq 2x_2$

So, our symbolic representation in JSON format is:
```json
{
    'sym_variables': [('x1', 'acres of lavender'), ('x2', 'acres of tulips')],
    'objective_function': '250*x1 + 200*x2',
    'constraints': ['x1 + x2 <= 50', 'x1 >= 5', 'x2 >= 8', 'x1 <= 2*x2']
}
```

To solve this linear programming problem using Gurobi in Python, we will use the following code:

```python
from gurobipy import *

# Create a new model
m = Model("Lavender_Tulips")

# Create variables
x1 = m.addVar(name='x1', lb=0)  # acres of lavender
x2 = m.addVar(name='x2', lb=0)  # acres of tulips

# Set the objective function
m.setObjective(250*x1 + 200*x2, GRB.MAXIMIZE)

# Add constraints
m.addConstr(x1 + x2 <= 50, name='total_acres')
m.addConstr(x1 >= 5, name='min_lavender')
m.addConstr(x2 >= 8, name='min_tulips')
m.addConstr(x1 <= 2*x2, name='max_lavender_to_tulip_ratio')

# Optimize model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Acres of lavender: {x1.x}")
    print(f"Acres of tulips: {x2.x}")
    print(f"Maximum profit: ${250*x1.x + 200*x2.x:.2f}")
else:
    print("No optimal solution found")
```