To solve George's problem, we first need to translate the natural language description into a symbolic representation. Let's denote:

- $x_1$ as the number of acres for coconut trees,
- $x_2$ as the number of acres for banana trees.

The objective is to maximize profit. The profit from coconut trees per acre is $400 - 200 = 200$, and from banana trees per acre is $350 - 150 = 200$. Therefore, the total profit can be represented by the objective function:

\[ \text{Maximize:} \quad 200x_1 + 200x_2 \]

The constraints are:
1. Budget constraint: The total cost for maintaining coconut and banana trees should not exceed $15,000.
   - Coconut trees cost $200 per acre, so $200x_1$ is the cost for coconut trees.
   - Banana trees cost $150 per acre, so $150x_2$ is the cost for banana trees.
   - Therefore, the budget constraint can be represented as: $200x_1 + 150x_2 \leq 15,000$.

2. Labor constraint: The total labor required should not exceed 750 days.
   - Coconut trees require 5 days of labor per acre, so $5x_1$ is the labor for coconut trees.
   - Banana trees require 4 days of labor per acre, so $4x_2$ is the labor for banana trees.
   - Therefore, the labor constraint can be represented as: $5x_1 + 4x_2 \leq 750$.

3. Non-negativity constraints: The number of acres for each type of tree cannot be negative.
   - $x_1 \geq 0$
   - $x_2 \geq 0$

4. Total land constraint: George has a total of 200 acres available.
   - $x_1 + x_2 \leq 200$

The symbolic representation in JSON format is:
```json
{
    'sym_variables': [('x1', 'acres for coconut trees'), ('x2', 'acres for banana trees')],
    'objective_function': '200*x1 + 200*x2',
    'constraints': [
        '200*x1 + 150*x2 <= 15000',
        '5*x1 + 4*x2 <= 750',
        'x1 >= 0',
        'x2 >= 0',
        'x1 + x2 <= 200'
    ]
}
```

Now, let's implement the solution using Gurobi in Python:
```python
from gurobipy import *

# Create a model
m = Model("George_Trees")

# Define variables
x1 = m.addVar(name="coconut_acres", lb=0)
x2 = m.addVar(name="banana_acres", lb=0)

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

# Add constraints
m.addConstr(200*x1 + 150*x2 <= 15000, name="budget")
m.addConstr(5*x1 + 4*x2 <= 750, name="labor")
m.addConstr(x1 + x2 <= 200, name="land")

# Optimize the model
m.optimize()

# Print the solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Coconut acres: {x1.x}")
    print(f"Banana acres: {x2.x}")
    print(f"Max Profit: {m.objVal}")
else:
    print("No optimal solution found")
```