To solve the optimization problem described, let's first break down the natural language description into a symbolic representation. This involves defining variables and translating the constraints and objective function into algebraic terms.

### Symbolic Representation:
- Let `x1` represent the number of large bottles.
- Let `x2` represent the number of small bottles.

The **objective function** is to maximize profit, which can be represented as `5x1 + 3x2`, since each large bottle yields a profit of $5 and each small bottle yields a profit of $3.

The **constraints** are:
1. Budget constraint: The total cost must not exceed $1000. This translates to `3x1 + 2x2 <= 1000`.
2. Shelf space constraint: The store has 500 units of shelf space, so `2x1 + x2 <= 500`.
3. Small bottles percentage constraint: At least 50% of the stock should be small bottles, which can be represented as `x2 >= 0.5(x1 + x2)` or simplified to `x2 >= 0.5x1 + 0.5x2`, and further to `0.5x2 >= 0.5x1`, or simply `x2 >= x1`.

### Symbolic Representation in JSON Format:
```json
{
  'sym_variables': [('x1', 'number of large bottles'), ('x2', 'number of small bottles')],
  'objective_function': 'Maximize 5*x1 + 3*x2',
  'constraints': [
    '3*x1 + 2*x2 <= 1000',
    '2*x1 + x2 <= 500',
    'x2 >= x1'
  ]
}
```

### Gurobi Code in Python:
To solve this problem using Gurobi, we need to install the `gurobipy` package if not already installed (`pip install gurobipy`). Here is how you can implement it:

```python
from gurobipy import *

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

# Define variables
x1 = m.addVar(vtype=GRB.INTEGER, name="large_bottles")
x2 = m.addVar(vtype=GRB.INTEGER, name="small_bottles")

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

# Add constraints
m.addConstr(3*x1 + 2*x2 <= 1000, "budget")
m.addConstr(2*x1 + x2 <= 500, "shelf_space")
m.addConstr(x2 >= x1, "small_bottles_percentage")

# Optimize model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print(f"Optimal solution found: Large bottles = {x1.x}, Small bottles = {x2.x}")
    print(f"Maximum Profit: {m.objVal}")
else:
    print("No optimal solution found")
```